from commons.entity.po.reimbursement import Reimbursement
from commons.entity.query.reimbursement_query import ReimbursementQuery
from travel_service.travel.mappers.reimbursement_mapper import ReimbursementMapper
from travel_service.travel.service.client.approval_client import ApprovalClient


class ReimbursementService:
    def __init__(self):
        self.reimbursement_mapper = ReimbursementMapper()
        self.approval_client = ApprovalClient()

    def find_list_by_param(self, reimbursement_query=None):
        """
        业务逻辑：根据多个参数查询报销列表。
        :param reimbursement_query: ReimbursementQuery 实例，包含查询过滤条件。
        :return: 包含报销信息字典的列表。
        """
        print("ReimbursementService find_list_by_param")
        print(reimbursement_query)

        return self.reimbursement_mapper.select_list(Reimbursement, reimbursement_query)

    def find_count_by_param(self, reimbursement_query=None):
        """
        业务逻辑：根据多个参数统计报销数量。
        :param reimbursement_query: ReimbursementQuery 实例，包含查询过滤条件。
        :return: 符合条件的报销数量。
        """
        print("ReimbursementService find_count_by_param")
        print(reimbursement_query)

        return self.reimbursement_mapper.select_count(Reimbursement, reimbursement_query)

    def get_reimbursement_by_id(self, reimbursement_id):
        """
        业务逻辑：获取报销信息
        :param reimbursement_id: str
        :return: 报销信息字典或 None
        """
        print("ReimbursementService get_reimbursement_by_id ")
        print(reimbursement_id)

        return self.reimbursement_mapper.select_by_reimbursement_id(reimbursement_id)

    def add(self, reimbursement_bean):
        """
        业务逻辑：添加一个新的报销。
        :param reimbursement_bean: Reimbursement 类实例，包含报销信息。
        :return: 插入操作是否成功（True/False）。
        """
        print("ReimbursementService add reimbursement")
        print(reimbursement_bean)

        return self.reimbursement_mapper.insert(reimbursement_bean)

    def add_batch(self, reimbursement_list_bean):
        """
        业务逻辑：批量添加报销。
        :param reimbursement_list_bean: 包含多个 Reimbursement 类实例的列表，包含需要插入的报销信息。
        :return: 插入操作成功的报销数量。
        """
        print("ReimbursementService add_batch reimbursements")
        print(reimbursement_list_bean)

        if not reimbursement_list_bean:
            print("No reimbursements to add. The input list is either null or empty.")
            return 0

        return self.reimbursement_mapper.insert_batch(reimbursement_list_bean)

    def add_or_update_batch(self, reimbursement_list_bean):
        """
        业务逻辑：批量插入或更新报销信息。
        :param reimbursement_list_bean: 包含多个 Reimbursement 类实例的列表，包含需要插入或更新的报销信息。
        :return: 插入或更新成功的报销数量。
        """
        print("ReimbursementService add_or_update_batch reimbursements")
        print(reimbursement_list_bean)

        if not reimbursement_list_bean:
            print("No reimbursements to add. The input list is either null or empty.")
            return 0

        return self.reimbursement_mapper.insert_or_update_batch(Reimbursement, reimbursement_list_bean)

    def update_by_param(self, reimbursement_bean, reimbursement_query):
        """
        业务逻辑：根据多个条件更新报销信息。
        :param reimbursement_bean: Reimbursement 类实例或字典，包含需要更新的字段及其新值。
        :param reimbursement_query: ReimbursementQuery 类实例或字典，包含用于定位记录的过滤条件。
        :return: 更新成功的数量。
        """
        print("ReimbursementService update_by_param")
        print(reimbursement_bean)
        print(reimbursement_query)

        return self.reimbursement_mapper.update_by_params(Reimbursement, reimbursement_bean, reimbursement_query)

    def delete_by_param(self, reimbursement_query):
        """
        业务逻辑：根据多个条件删除报销信息。
        :param reimbursement_query: ReimbursementQuery 类实例或字典，包含用于定位记录的过滤条件。
        :return: 删除成功的数量。
        """
        print("ReimbursementService delete_by_param")
        print(reimbursement_query)

        return self.reimbursement_mapper.delete_by_param(Reimbursement, reimbursement_query)

    def update_reimbursement_by_id(self, reimbursement_bean, reimbursement_id):
        """
        业务逻辑：根据 reimbursement_id 更新报销信息
        :param reimbursement_id: str
        :param reimbursement_bean: Reimbursement 类实例，包含需要更新的报销属性
        :return: 更新成功信息或错误信息
        """
        print("ReimbursementService update_reimbursement_by_id ")
        print(
            f"reimbursement_id: {reimbursement_id}, reimbursement_bean: {reimbursement_bean}")

        return self.reimbursement_mapper.update_by_reimbursement_id(reimbursement_bean, reimbursement_id)

    def delete_reimbursement_by_id(self, reimbursement_id):
        """
        业务逻辑：根据 reimbursement_id 删除报销
        :param reimbursement_id: str
        :return: 删除成功或错误
        """
        print("ReimbursementService delete_reimbursement_by_id ")
        print(reimbursement_id)

        return self.reimbursement_mapper.delete_by_reimbursement_id(reimbursement_id)

    def get_reimbursements_by_id_list(self, id_list):
        """
        业务逻辑：根据报销ID列表获取多个报销信息。
        :param id_list: 包含多个报销ID的列表。
        :return: 包含多个报销信息的列表。
        """
        print("ReimbursementService get_reimbursements_by_id_list")
        print(id_list)

        if not id_list:
            return []

        reimbursements = []
        for travel_id in id_list:
            reimbursement_query = ReimbursementQuery()
            reimbursement_query.travel_id = travel_id
            reimbursement = self.find_list_by_param(
                reimbursement_query)[0]

            if reimbursement:
                reimbursements.append(reimbursement)

        return reimbursements

    def add_reimbursement(self, reimbursement_data):
        """
        业务逻辑：添加新的报销记录。
        :param reimbursement_data: 包含报销信息的字典。
        """
        print("ReimbursementService add method")
        print(reimbursement_data)

        # reimbursement_bean 包含 travelId 字段
        travel_id = str(reimbursement_data.travel_id)  # 旅行ID

        # 2. 更新审批信息
        self.approval_client.update_approval_by_travel_id(travel_id)
        # 在服务层处理更多业务逻辑（例如验证、处理等）
        self.reimbursement_mapper.insert_reimbursement(reimbursement_data)

        # 假设mapper负责将数据插入数据库
        return True

    def get_reimbursement_by_travel_id(self, travel_id):
        """
        业务逻辑：获取报销信息
        :param travel_id: str
        :return: 报销信息字典或 None
        """
        print("ReimbursementService get_reimbursement_by_travel_id ")
        print(travel_id)

        return self.reimbursement_mapper.select_by_travel_id(travel_id)







